Le passage des macros de style C aux littéraux sécurisés par type en C++ représente un changement fondamental dans l'utilisabilité du langage, résolvant le "erreur NULL" où l'ambiguïté entre le macro zéro provoque des erreurs logiques silencieuses.
1. L'échec de résolution des surcharges
Dans les anciennes normes (C++98), NULL est souvent défini comme 0. Lorsqu'il est passé à des fonctions surchargées, le compilateur le résout NULL comme un entier. Cela est prouvé par :
std::cout << "NULL est un entier";
2. La solution nullptr
C++11 a introduit nullptr, un mot-clé de type std::nullptr_t. Contrairement au macro, il ne peut pas être converti implicitement en type entier (sauf bool), garantissant que les surcharges spécifiques aux pointeurs sont sélectionnées.
3. Liaison et interopérabilité
Le C++ moderne nécessite extern "C" pour empêcher la transformation des noms lors du lien avec du code C (par exemple, compilé avec gcc). Le maintien de pointeurs sécurisés par type à cette frontière est essentiel.
$$\text{std::nullptr\_t} \neq \text{int}$$